import copy
import re
from typing import List, Tuple, Dict

import regex

from conf.config import config


def count_words(string: str, excluded_char_ist: List) -> int:
    """
    计算字数：一个汉字计数1，一个单词计数1，一个标点符号计数1，一个数字计数1
    :param string: 待统计字符的字符串
    :param excluded_char_ist: 排除的字符列表
    :return: 单词数
    """

    # 删去无效的字符
    excluded_char_ist = copy.deepcopy(excluded_char_ist)
    for char in excluded_char_ist:
        string = string.replace(char, "")

    # 匹配中文字符、英文单词、数字和标点符号
    pattern = regex.compile(r'[\u4e00-\u9fa5]|[a-zA-Z]+|-?\d*\.?\d+%?|\p{P}')

    count = len(regex.findall(pattern, string))
    return count


def all_has_tags(text: str, startswith_tags: List, endswith_tags: List) -> bool:
    """
    判断正文的每一段是否都有带标签
    :param text: 文本
    :param startswith_tags: 以什么标签开头
    :param endswith_tags: 以什么标签结束
    :return:
    """

    chunks = [chunk.strip() for chunk in text.split('\n') if chunk.strip()]
    for chunk in chunks:
        if not any([True if chunk.startswith(tag) else False for tag in startswith_tags]):
            return False
        if not any([True if chunk.endswith(tag) else False for tag in endswith_tags]):
            return False
    return True


def remove_stop_words(text: str, stop_words: List) -> str:
    """
    去除停用词
    :param text: 文本
    :param stop_words: 停用词列表
    :return:
    """

    for stop_word in stop_words:
        text = text.replace(stop_word, "")

    return text


def remove_duplicate_paragraph_from_content(subtitles: List, paragraphs: List) -> List:
    """
    去除正文重复段落
    例1：
        <p><strong>小标题一：过去一年内重庆房价的走势</strong></p>
        <p>过去一年内重庆房价的走势</p>
    例2：
        <p><strong>过去一年内重庆房价的走势</strong></p>
        <p>过去一年内重庆房价的走势</p>
    :param subtitles: 小标题列表
    :param paragraphs: 段落列表
    :return:
    """

    if len(subtitles) != len(paragraphs):
        raise ValueError(f"小标题列表和段落列表长度不一")

    pattern = re.compile(r'<p>+(<strong>)?(.*?)(</strong>)?</p>')
    for i in range(len(subtitles)):
        subtitle = pattern.match(subtitles[i]).group(2)
        subtitle_without_stop_words = remove_stop_words(text=subtitle, stop_words=config.get("stop_words_subtitle"))  # 删掉小标题的停词后
        paragraph = pattern.match(paragraphs[i]).group(2)
        if (subtitle.rstrip(':').rstrip('：') == paragraph.rstrip(':').rstrip('：')) \
                or (subtitle_without_stop_words.rstrip(':').rstrip('：') == paragraph.rstrip(':').rstrip('：')):  # 只是差个中英文冒号，也认为是重复的段落
            _, paragraphs[i] = paragraphs[i].split(sep='\n', maxsplit=1)  # 删去第一段
            paragraphs[i] = paragraphs[i].lstrip()    # 删去前导空白符

    return paragraphs


def extract_abstract_and_keywords(txt: str) -> Tuple:
    """
    提取摘要、关键词
    :param txt: 要提取的文本
    :return:
    """
    pattern = r"摘要如下：\s*(.+)\s*关键词如下：\s*(.+)\s*"

    result = re.search(pattern, txt)
    if not result:
        abstract = "未匹配到内容，请检查原文件"
        keywords = "未匹配到内容，请检查原文件"
    else:
        abstract = result.group(1).strip()
        keywords = result.group(2).strip()

    return abstract, keywords


def extract_title_and_abstract_and_keywords(txt: str) -> Tuple:
    """
    提取标题、摘要、关键词
    :param txt: 要提取的文本
    :return:
    """
    pattern = r"标题如下：\s*(.+)\s*摘要如下：\s*(.+)\s*关键词如下：\s*(.+)\s*"

    result = re.search(pattern, txt)
    if not result:
        title = "未匹配到内容，请检查原文件"
        abstract = "未匹配到内容，请检查原文件"
        keywords = "未匹配到内容，请检查原文件"
    else:
        title = result.group(1).strip()
        abstract = result.group(2).strip()
        keywords = result.group(3).strip()

    return title, abstract, keywords


def extract_abstract_and_keywords_and_content(txt: str) -> Dict:
    """
    提取文本中的摘要、关键词、正文
    :param txt: 要提取的文本
    :return:
    """
    pattern = r"摘要如下：\s*(.+)\s*关键词如下：\s*(.+)\s*正文如下：\s*([\s\S]+)"

    result = re.search(pattern, txt)
    if not result:
        abstract = "未匹配到内容，请检查原文件"
        keywords = "未匹配到内容，请检查原文件"
        content = "未匹配到内容，请检查原文件"
    else:
        abstract = result.group(1).strip()
        keywords = result.group(2).strip()
        content = result.group(3).strip()

    data = {
        "abstract": abstract,
        "keywords": keywords,
        "content": content,
    }
    return data


def main():
    # 字数统计
    # string = """english book汉\n字，@测试
    # """
    # count = count_words(string, excluded_char_ist=[])
    # print("单词数：", count)
    # count = count_words(string, excluded_char_ist=["汉"])
    # print("单词数：", count)

    # # 判断是否都有标签
    # text = """<p><strong>上海和北京的房价到底哪个更贵？</strong></p>
    # <p>这是一个经常在社交媒体上引发热议的话题。虽然说两个城市都是国内房价高企的城市，但是它们的房价情况并不完全相同。</p>
    # <p>综上所述，尽管两个城市的房价均处于高位，但是上海的房价增幅要大于北京，而两座城市房价背后的主要原因都是土地供应不足和政策管控。具体而言，上海和北京的城市特点也存在着很多不同之处。因此，在调查两个城市的房产市场时，我们也需要考虑很多城市独特的因素。</p>
    # """
    # res = all_has_tags(text=text,
    #                    startswith_tags=config.get("startswith_tags"),
    #                    endswith_tags=config.get("endswith_tags"))
    # print(res)

    # 去除正文的重复段落
    subtitles = [
        "<p><strong>小标题一：日照房价一年内的变化</strong></p>",
        "<p><strong>小标题二：房价一年内的变化</strong></p>",
        "<p><strong>小标题三：一年内的变化</strong></p>"
    ]
    paragraphs = [
        "<p>小标题一：日照房价一年内的变化</p>\n测试1\n测试1",
        "<p>房价一年内的变化：</p>\n测试2",
        "<p>小标题三：一年内的变化</p>\n测试3",
    ]
    print(
        remove_duplicate_paragraph_from_content(
            subtitles=subtitles,
            paragraphs=paragraphs
        )
    )


if __name__ == '__main__':
    main()
